<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>new</title>
</head>
<body>
<script>
    /*
    *  new操作符具体做了什么?
    1.创建了一个空的对象
    2.将空对象的原型，指向于构造函数的原型
    3.将空对象作为构造函数的上下文 (改变this指向)
    4.对构造函数有返回值的处理判断*/


    // 模拟  new
    //Fun为构造函数, args表示传参
    function myNew(Fun, ...args) {
        // 1.在内存中创建一个新对象
        let obj = {};

        // 2.把新对象的原型指针指向构造函数的原型属性
        obj.__proto__ = Fun.prototype;
        // Object.setPrototypeOf(obj, Fun.prototype); //不同的写法

        // 3.改变this指向，并且执行构造函数内部的代码（传参）
        let res = Fun.apply(obj, args);

        // 4.判断函数执行结果的类型
        if (res instanceof Object) {
            return res;
        } else {
            return obj;
        }
    }

    let obj = myNew(One, "XiaoMing", "18");
    console.log("newObj:", obj);


</script>
</body>
</html>
